package com.task.myThreadPool;

import lombok.extern.slf4j.Slf4j;

import java.util.concurrent.TimeUnit;

/**
 * @author cxt
 * @date 2022/2/16
 * 测试线程池
 */
@Slf4j
public class TestPool {
    public static void main(String[] args) {
        ThreadPool pool = new ThreadPool(2, 20000, TimeUnit.MILLISECONDS, 10, (queue, task) -> {
            // 1、死等
            // queue.put(task);
            // 2、超时放弃，这里调用队列中的超时添加方法
            // 3、直接放弃添加，这个方法中没有代码就是放弃，也可以打印一条日志
            // log.debug("放弃任务的执行");
            // 4、调用者抛出异常，这里抛出异常,这里是main线程抛出异常，所以异常后面的任务都不会被执行
            // throw new RuntimeException("队列已满，出现异常");
            // 5、调用者自己执行当前任务,这里是main线程调用，所以是main线程执行任务，main线程已经拿到任务对象，所以执行调用run即可
            task.run();
        });

        for (int i = 0; i < 15; i++) {
            int k = i;
            pool.executor(() -> {
                try {
                    Thread.sleep(1000);
                    log.debug("模拟任务执行{}", k);
                } catch (InterruptedException e) {
                    e.printStackTrace();
                }
            });
        }
    }
}
